package com.hzx.zhihu.utils;

import com.tencentcloudapi.ai3d.v20250513.Ai3dClient;
import com.tencentcloudapi.ai3d.v20250513.models.QueryHunyuanTo3DJobRequest;
import com.tencentcloudapi.ai3d.v20250513.models.QueryHunyuanTo3DJobResponse;
import com.tencentcloudapi.ai3d.v20250513.models.SubmitHunyuanTo3DJobRequest;
import com.tencentcloudapi.ai3d.v20250513.models.SubmitHunyuanTo3DJobResponse;
import com.tencentcloudapi.common.AbstractModel;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import org.springframework.stereotype.Component;

@Component
public class TencentUtil {
    // 1. 配置参数（可根据实际需求调整）
    private static final String REGION = "ap-guangzhou"; // 地域（需与控制台配置一致）
    private static final long CHECK_INTERVAL = 100000; // 每次查询间隔：100秒（单位：毫秒）
    private static final int MAX_RETRY_TIMES = 30; // 最大查询次数：30次（总等待时间=30*10=300秒=5分钟）
    private static final boolean ENABLE_PBR = true; // 开启PBR材质（提升模型质感）
    public QueryHunyuanTo3DJobResponse createQueryHunyuanTo3DJobRequest(String imageUrl) {
        try {
            // 步骤1：提交3D任务，获取JobId
            String jobId = submitHunyuanTo3DJob(imageUrl);
            if (jobId == null || jobId.isEmpty()) {
                System.err.println("提交3D任务失败，无法获取JobId");
            }
            System.out.println("成功提交3D任务，JobId：" + jobId);

            // 步骤2：循环查询任务结果（核心改进）
            QueryHunyuanTo3DJobResponse finalResponse = waitAndGetHunyuanTo3DResult(jobId);
            if (finalResponse == null) {
                System.err.println("任务查询超时或失败");
            }

            // 步骤3：输出最终结果（含模型下载链接）
            System.out.println("\n===== 3D任务最终结果 =====");
            System.out.println(AbstractModel.toJsonString(finalResponse));
            // 可进一步提取模型链接：finalResponse.getResultFile3Ds()[0].getUrl()
            if (finalResponse.getResultFile3Ds() != null && finalResponse.getResultFile3Ds().length > 0) {
                String modelUrl = finalResponse.getResultFile3Ds()[0].getUrl();
                String previewUrl = finalResponse.getResultFile3Ds()[0].getPreviewImageUrl();
                System.out.println("\n模型下载链接：" + modelUrl);
                System.out.println("模型预览图链接：" + previewUrl);
            }
            return finalResponse;

        } catch (Exception e) {
            System.err.println("程序执行异常：" + e.getMessage());
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 提交3D任务，返回JobId
     */
    private static String submitHunyuanTo3DJob(String imageUrl) {
        try {
            // 创建Ai3dClient（抽取重复逻辑，复用客户端）
            Ai3dClient client = createAi3dClient();

            // 构建提交任务请求
            SubmitHunyuanTo3DJobRequest req = new SubmitHunyuanTo3DJobRequest();
            req.setImageUrl(imageUrl); // 核心参数：图片URL
            req.setEnablePBR(ENABLE_PBR); // 开启PBR材质
            // 可选：设置模型格式（默认OBJ，可指定GLB/STL等）
            // req.setResultFormat("GLB");

            // 发送请求并获取响应
            SubmitHunyuanTo3DJobResponse resp = client.SubmitHunyuanTo3DJob(req);
            return resp.getJobId(); // 返回任务唯一标识

        } catch (TencentCloudSDKException e) {
            System.err.println("提交3D任务异常：" + e.toString());
            return null;
        }
    }

    /**
     * 循环等待并查询任务结果（核心逻辑）
     *
     * @param jobId 任务ID
     * @return 最终任务响应（状态为DONE/FAILED）
     */
    private static QueryHunyuanTo3DJobResponse waitAndGetHunyuanTo3DResult(String jobId) {
        Ai3dClient client = createAi3dClient();
        if (client == null) {
            return null;
        }

        for (int retry = 1; retry <= MAX_RETRY_TIMES; retry++) {
            try {
                // 构建查询请求
                QueryHunyuanTo3DJobRequest req = new QueryHunyuanTo3DJobRequest();
                req.setJobId(jobId);

                // 发送查询请求
                QueryHunyuanTo3DJobResponse resp = client.QueryHunyuanTo3DJob(req);
                String currentStatus = resp.getStatus();
                System.out.printf("第%d次查询（间隔%d秒），任务状态：%s\n",
                        retry, CHECK_INTERVAL / 1000, currentStatus);

                // 根据状态判断是否终止循环
                switch (currentStatus) {
                    case "DONE": // 任务完成（成功）
                        System.out.println("任务已完成，获取到最终模型结果");
                        return resp;
                    case "FAILED": // 任务失败
                        System.err.println("任务执行失败，错误信息：" + resp.getErrorMessage());
                        return resp;
                    case "RUNNING": // 任务处理中（继续等待）
                        Thread.sleep(CHECK_INTERVAL); // 等待指定时间后再次查询
                        break;
                    default: // 其他状态（如INIT，继续等待）
                        System.out.println("任务处于未知状态：" + currentStatus + "，继续等待...");
                        Thread.sleep(CHECK_INTERVAL);
                        break;
                }

            } catch (TencentCloudSDKException e) {
                System.err.println("第%d次查询异常：" + e.toString());
                try {
                    Thread.sleep(CHECK_INTERVAL); // 异常后也等待一段时间再重试
                } catch (InterruptedException ie) {
                    Thread.currentThread().interrupt();
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                System.err.println("查询等待被中断：" + e.getMessage());
                return null;
            }
        }

        // 超过最大重试次数（超时）
        System.err.printf("已超过最大查询次数（%d次），任务可能仍在处理中，请稍后手动查询JobId：%s\n",
                MAX_RETRY_TIMES, jobId);
        return null;
    }

    /**
     * 抽取Ai3dClient创建逻辑，避免重复代码
     */
    private static Ai3dClient createAi3dClient() {
        // 从环境变量获取密钥（生产环境推荐用KMS等更安全的方式）
        String secretId = System.getenv("TENCENTCLOUD_SECRET_ID");
        String secretKey = System.getenv("TENCENTCLOUD_SECRET_KEY");
        if (secretId == null || secretId.isEmpty() || secretKey == null || secretKey.isEmpty()) {
            System.err.println("环境变量中未配置TENCENTCLOUD_SECRET_ID或TENCENTCLOUD_SECRET_KEY");
            return null;
        }

        // 构建密钥对象
        Credential cred = new Credential(secretId, secretKey);
        // 临时密钥场景（可选）：cred = new Credential(secretId, secretKey, token);

        // 配置HTTP请求参数
        HttpProfile httpProfile = new HttpProfile();
        httpProfile.setEndpoint("ai3d.tencentcloudapi.com"); // 固定Endpoint
        httpProfile.setConnTimeout(3000); // 连接超时时间（3秒）
        httpProfile.setReadTimeout(5000); // 读取超时时间（5秒）

        // 配置客户端参数
        ClientProfile clientProfile = new ClientProfile();
        clientProfile.setHttpProfile(httpProfile);
        clientProfile.setSignMethod("HmacSHA256"); // 签名方法（推荐HmacSHA256）

        // 创建Ai3dClient实例
        return new Ai3dClient(cred, REGION, clientProfile);

    }
}